using System;
using System.Collections.Generic;
using System.Text;

class Warenkorb
{
    /**
     * Eine Liste aller Artikel im Warenkorb.
     */
    private List<WarenkorbItem> itemListe = new List<WarenkorbItem>();

    /**
     * Gibt den Gesamtpreis aller Artikel im Warenkorb zurück.
     */
    public double Gesamtpreis // Als Property (Eigenschaft)
    {
        get 
        {
            double summe = 0;
            foreach (WarenkorbItem item in itemListe)
            {
                summe += item.ItemPreis;
            }

            return summe;
        }
    }

    /**
     * Fügt einen über die Artikel-ID identifizierten Artikel mit einer gewünschten Anzahl dem Warenkorb hinzu. Befindet sich der Artikel bereits im Warenkorb, wird die Anzahl erhöht.
     * <br/>Gibt true zurück, wenn erfolgreich, sonst false.
     * @param artikelId Die ID des Artikels.
     * @param anzahl Die gewünschte Anzahl.
     * @return True wenn erfolgreich, sonst False.
     */
    public bool ArtikelHinzufügen(int artikelId, int anzahl)
    {
        // Sucht in der ArtikelListe der Klasse Artikel nach dem Objekt mit der passenden artikelID und gibt den Artikel zurück, wenn er gefunden wurde, sonst null.
        Artikel? artikel = Artikel.getArtikel(artikelId);
        // Und wenn der Artikel gefunden wurde...
        return ArtikelHinzufügen(artikel, anzahl); // Aufruf der zweiten 'ArtikelHinzufügen' Methode
    }

    /**
     * Fügt einen Artikel mit einer gewünschten Anzahl dem Warenkorb hinzu. Befindet sich der Artikel bereits im Warenkorb, wird die Anzahl erhöht.
     * <br/>Gibt true zurück, wenn erfolgreich, sonst false.
     * @param artikel Der Artikel.
     * @param anzahl Die gewünschte Anzahl.
     * @return True wenn erfolgreich, sonst False.
     */
    public bool ArtikelHinzufügen(Artikel? artikel, int anzahl)
    {
        if (artikel != null)
        {
            // dann prüfen wir, ob der gesuchte Artikel bereits im Warenkorb ist, indem wir uns jedes Item im Warenkorb anschauen...
            foreach (WarenkorbItem item in itemListe)
            {
                // und wenn ein Item im Warenkorb dem gefundenen Artikel entspricht...
                if (item.Item == artikel)
                {
                    // dann erhöhen wir einfach die Anzahl
                    item.Anzahl = item.Anzahl + anzahl;
                    return true;
                }
            }
            // Sonst fügen wir den Artikel neu dem Warenkorb hinzu
            itemListe.Add(new WarenkorbItem(artikel, anzahl));
            return true;
        }
        // Wenn wir keinen Artikel mit der artikelId gefunden haben, geben wir false zurück
        return false;
    }

    /**
     * Entfernt einen Artikel aus dem Warenkorb.
     */
    public bool ArtikelEntfernen(int artikelId, int anzahl)
    {
        // Sucht in der ArtikelListe der Klasse Artikel nach dem Objekt mit der passenden artikelID und gibt den Artikel zurück, wenn er gefunden wurde, sonst null.
        Artikel? artikel = Artikel.getArtikel(artikelId);
        // Und wenn der Artikel gefunden wurde...
        return ArtikelEntfernen(artikel, anzahl);
    }

    /**
     * Entfernt einen Artikel aus dem Warenkorb.
     */
    public bool ArtikelEntfernen(Artikel? artikel, int anzahl)
    {
        if (artikel != null)
        {
            foreach (WarenkorbItem item in itemListe)
            {
                // und wenn ein Item im Warenkorb dem Artikel entspricht...
                if (item.Item == artikel)
                {
                    // wenn die verbleibende Anzahl kleiner gleich 0 ist
                    if (item.Anzahl - anzahl <= 0)
                    {
                        // dann entfernen wir den Artikel komplett aus dem Warenkorb
                        itemListe.Remove(item);
                    }
                    // Sonst verringern wir die Anzahl im Warenkorb um die gewünschte Anzahl
                    else
                    {
                        item.Anzahl = item.Anzahl - anzahl;
                    }

                    return true;
                }
            }

            // Wenn sich der Artikel nicht im Warenkorb befindet...
            return false;
        }

        // Wenn der Artikel nicht gefunden wurde...
        return false;
    }


    /**
     * Gibt einen String mit Informationen zu allen Artikeln im Warenkorb zurück, inklusive der Summe.
     */
    public string GetWarenkorbString()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("Aktueller Warenkorb: \n");

        // Ruft für jedes Item im Warenkorb die GetWarenkorbItemString-Methode auf...
        foreach (WarenkorbItem item in itemListe)
        {
            // und fügt den Rückgabewert dem String hinzu
            sb.Append(item.GetWarenkorbItemString()).Append("\n");
        }
        sb.Append(String.Format($"Summe: {Gesamtpreis:C2}"));
        return sb.ToString();
    }

}

